/*
 * jpeg_mem.h
 *
 *  Created on: 2016年1月19日
 *      Author: guyadong
 */

#ifndef FACEIMAGE_CIMGWRAPPER_JPEG_MEM_H_
#define FACEIMAGE_CIMGWRAPPER_JPEG_MEM_H_

 // 根据平台定义符号以导出/导入
#if defined(_WIN32) || defined(_WIN64)
#ifdef IMAGEWRAP_EXPORTS
#define IMAGEWRAP_API __declspec(dllexport)
#else
#define IMAGEWRAP_API __declspec(dllimport)
#endif
#else
#define IMAGEWRAP_API
#endif

#include <stdexcept>
#include <functional>
#include <cstdio>
#include <string>
#include <vector>
#include <memory>
#include "image_matrix_types.h"

/**
 * @class jpeg_mem_exception
 * @brief 用于处理 JPEG 内存处理错误的异常类。
 *
 * 该类继承自 std::logic_error，以提供与 JPEG 内存操作相关的特定异常。
 */
class jpeg_mem_exception : public std::logic_error {
public:
    // 继承自 std::logic_error 的构造函数
    using std::logic_error::logic_error;
};

/**
 * @brief 将图像矩阵转换为 JPEG 格式的字符串。
 *
 * @param matrix 要转换的图像矩阵。
 * @param quality JPEG 的质量因子（默认为100）。
 * @return 一个包含 JPEG 数据的字符串。
 */
IMAGEWRAP_API std::string jwp_save_jpeg_mem_as_string(const fs_image_matrix& matrix, const unsigned int quality = 100);

/**
 * @brief 将图像矩阵转换为 JPEG 格式的字节向量。
 *
 * @param matrix 要转换的图像矩阵。
 * @param quality JPEG 的质量因子（默认为100）。
 * @return 一个包含 JPEG 数据的字节向量。
 */
IMAGEWRAP_API std::vector<uint8_t> jwp_save_jpeg_mem_as_vector(const fs_image_matrix& matrix, const unsigned int quality = 100);

#if 0
/**
 * @brief 将图像矩阵转换为 JPEG 格式的灰度字符串。
 *
 * @param matrix 要转换为灰度的图像矩阵。
 * @param quality JPEG 的质量因子（默认为100）。
 * @return 一个包含 JPEG 灰度数据的字符串。
 */
IMAGEWRAP_API std::string jwp_save_jpeg_gray_mem_as_string(const fs_image_matrix& matrix, const unsigned int quality = 100);

/**
 * @brief 将图像矩阵转换为 JPEG 格式的灰度字节向量。
 *
 * @param matrix 要转换为灰度的图像矩阵。
 * @param quality JPEG 的质量因子（默认为100）。
 * @return 一个包含 JPEG 灰度数据的字节向量。
 */
IMAGEWRAP_API std::vector<uint8_t> jwp_save_jpeg_gray_mem_as_vector(const fs_image_matrix& matrix, const unsigned int quality = 100);
#endif
/**
 * @brief 将 JPEG 数据解码为图像矩阵。
 *
 * @param jpeg_data 原始 JPEG 数据。
 * @param size JPEG 数据的大小。
 * @return 解码后的图像矩阵。
 * @throws jpeg_mem_exception 如果数据无法解码。
 */
IMAGEWRAP_API fs_image_matrix jwp_load_jpeg_mem(const void* jpeg_data, size_t size);
#if 0
/**
 * @brief 将 JPEG 数据解码为灰度图像矩阵。
 *
 * @param jpeg_data 原始 JPEG 数据。
 * @param size JPEG 数据的大小。
 * @return 解码后的灰度图像矩阵。
 * @throws jpeg_mem_exception 如果数据无法解码。
 */
IMAGEWRAP_API fs_image_matrix jwp_load_jpeg_gray_mem(const void* jpeg_data, size_t size);
#endif
/**
 * @brief 从文件中读取 JPEG 头信息。
 *
 * @param filename 要读取的文件名。
 * @return 包含头信息的图像矩阵。
 */
IMAGEWRAP_API fs_image_matrix jwp_read_jpeg_header_file(const char* const filename);

/**
 * @brief 从文件指针读取 JPEG 头信息。
 *
 * @param file 要读取的文件指针。
 * @return 包含头信息的图像矩阵。
 */
IMAGEWRAP_API fs_image_matrix jwp_read_jpeg_header_file(std::FILE* const file);

/**
 * @brief 从内存中读取 JPEG 头信息。
 *
 * @param jpeg_data 内存中的原始 JPEG 数据。
 * @param size JPEG 数据的大小。
 * @return 包含头信息的图像矩阵。
 */
IMAGEWRAP_API fs_image_matrix jwp_read_jpeg_header_mem(const void* jpeg_data, size_t size);

#endif /* FACEIMAGE_CIMGWRAPPER_JPEG_MEM_H_ */